package com.cs.beneficios.business.entity;

import com.cs.beneficios.business.model.ProgramaVO;
import com.cs.beneficios.business.model.SubProgramaVO;
import com.cs.beneficios.common.ConnectionFactory;

import com.cs.beneficios.web.form.SubprogramaForm;

//import com.cs.paoyer.administration.business.model.UserVO;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.sql.Types;

import java.util.ArrayList;
import java.util.Collection;


public class SubProgramaDAO
{
  /**
   * Conexion a la base de datos.
   */
  private Connection conn = null;
  private ConnectionFactory cf;

  /**
   * Constructor que inicializa la conexion con la base de datos.
   * @param conn Conexion con la base de datos.
   */
   
  public SubProgramaDAO(ConnectionFactory cf)
  {
    this.cf = cf;
    try{
        this.conn = this.cf.getConnection();
      }catch(SQLException e){}
  }
  
  public Collection findSubProgramaByCriterea(SubProgramaVO criterea) throws SQLException 
  {
    String query = "SELECT subpro.CODIGO,subpro.NOMBRE, subpro.DESCRIPCION, "+
                   "subpro.DIAS_REUTILIZAR, subpro.GRUPO_FAMILIAR, subpro.VALIDAR_CONTRA_ESTUD, "+
      "subpro.VALIDAR_CONTRA_SISBEN, subpro.DIRECCION_BEN_OBLIGATORIA, nvl(subpro.VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "+
                   "subpro.DESDE_VIGENCIA, subpro.HASTA_VIGENCIA, subpro.VIGENCIA, pro.CODIGO COD_PROGRAMA, "+
                   "pro.NOMBRE NOM_PROGRAMA, usu.CODIGO COD_USUARIO, usu.NOMBRE NOM_USUARIO, "+
                   "vflex.CODIGO COD_CATEGORIA, vflex.DESCRIPCION NOM_CATEGORIA "+
                   "FROM TCS_BEN_SUBPROGRAMA subpro, "+
                   "TCS_BEN_PROGRAMA pro, "+
                   "paoyer.TCS_USUARIO usu, "+ 
                   "paoyer.TCS_VALOR_FLEXIBLE vflex "+
                   "WHERE subpro.PRG_CODIGO = pro.CODIGO "+ 
                   "AND subpro.USU_CODIGO = usu.CODIGO "+
                   "AND vflex.CODIGO (+)= subpro.VFL_CODIGO_CATEGORIA ";
    
    if(criterea.getCode() != null)
    {
      query += "AND subpro.CODIGO = "+criterea.getCode()+" ";
    }
    if(!criterea.getNombre().equalsIgnoreCase(""))
    {
      query += "AND subpro.NOMBRE LIKE '%"+criterea.getNombre().toUpperCase().trim()+"%' ";
    }
    if(criterea.getCodePrograma() != null)
    {
      query += "AND pro.CODIGO = "+criterea.getCodePrograma()+" ";
    }
    
    query += " ORDER BY subpro.NOMBRE";
    System.err.println(query);
    ResultSet rst = null;
    ArrayList subprogramas = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
    SubProgramaVO subpro = null;
    while ( rst.next() ) 
    {
        subpro = new SubProgramaVO();
        subpro.setCode(new Long(rst.getLong( "CODIGO"))); 
        subpro.setNombre(rst.getString( "NOMBRE"));
        subpro.setDescripcion(rst.getString("DESCRIPCION"));
        subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
        subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
        subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
        subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
        subpro.setDirBenObligatoria(rst.getString("DIRECCION_BEN_OBLIGATORIA"));
        subpro.setValorUnitarioBeneficio(rst.getString("VALOR_UNITARIO_BENEFICIO"));
        subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
        subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
        subpro.setVigencia(rst.getString("VIGENCIA"));
        subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
        subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
        subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
        subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
        subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
        subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
        subprogramas.add(subpro);
        subpro=null;
    }
    rst.close();
    return subprogramas;
  }
  
  public Collection findTotalInformation(SubProgramaVO criterea) throws SQLException 
  {
      String query = "SELECT subpro.CODIGO,subpro.NOMBRE, subpro.DESCRIPCION, " + 
                     "subpro.DIAS_REUTILIZAR, subpro.CAMPO_A3 DIAS_RENOVAR, subpro.GRUPO_FAMILIAR, subpro.VALIDAR_CONTRA_ESTUD, " + 
                     "subpro.VALIDAR_CONTRA_SISBEN, subpro.DIRECCION_BEN_OBLIGATORIA, nvl(subpro.VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, " + 
                     "to_char(subpro.DESDE_VIGENCIA,'rrrr-mm-dd')DESDE_VIGENCIA, "+
                     "to_char(subpro.HASTA_VIGENCIA,'rrrr-mm-dd')HASTA_VIGENCIA , subpro.VIGENCIA, " + 
                     "subpro.AREA_CODIGO, area.NOMBRE NOM_AREA, subpro.COMENTARIO, " + 
                     "pro.CODIGO COD_PROGRAMA, " + 
                     "pro.NOMBRE NOM_PROGRAMA, usu.CODIGO COD_USUARIO, usu.NOMBRE NOM_USUARIO, " + 
                     "vflex.CODIGO COD_CATEGORIA, vflex.DESCRIPCION NOM_CATEGORIA "+
                     "FROM TCS_BEN_SUBPROGRAMA subpro, "+
                     "TCS_BEN_PROGRAMA pro, TCS_BEN_AREA area, "+
                     "paoyer.TCS_USUARIO usu, "+ 
                     "paoyer.TCS_VALOR_FLEXIBLE vflex "+
                     "WHERE subpro.PRG_CODIGO = pro.CODIGO "+ 
                     "AND subpro.USU_CODIGO = usu.CODIGO "+
                     "AND area.CODIGO = subpro.AREA_CODIGO "+
                     "AND vflex.CODIGO (+)= subpro.VFL_CODIGO_CATEGORIA ";
      
      if(criterea.getCode() != null)
      {
        query += "AND subpro.CODIGO = "+criterea.getCode()+" ";
      }
      if(!criterea.getNombre().equalsIgnoreCase(""))
      {
        query += "AND subpro.NOMBRE LIKE '%"+criterea.getNombre().toUpperCase().trim()+"%' ";
      }
      if(criterea.getCodePrograma() != null)
      {
        query += "AND pro.CODIGO = "+criterea.getCodePrograma()+" ";
      }
      
      query += " ORDER BY subpro.NOMBRE";
      //System.out.println(query);
      ResultSet rst = null;
      ArrayList subprogramas = new ArrayList();
      rst = cf.getRecordsRset(query,null,conn);
      SubProgramaVO subpro = null;
      while ( rst.next() ) 
      {
          subpro = new SubProgramaVO();
          subpro.setCode(new Long(rst.getLong( "CODIGO"))); 
          subpro.setNombre(rst.getString( "NOMBRE"));
          subpro.setDescripcion(rst.getString("DESCRIPCION"));
          subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
          subpro.setDiasRenovacion(rst.getString("DIAS_RENOVAR"));
          subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
          subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
          subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
          subpro.setDirBenObligatoria(rst.getString("DIRECCION_BEN_OBLIGATORIA"));
          subpro.setValorUnitarioBeneficio(rst.getString("VALOR_UNITARIO_BENEFICIO"));
          subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
          subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
          subpro.setVigencia(rst.getString("VIGENCIA"));
          subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
          subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
          subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
          subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
          subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
          subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
          subpro.setCodeArea(new Long(rst.getLong("AREA_CODIGO")));
          subpro.setNombreArea(rst.getString("NOM_AREA"));
          subpro.setComentario(rst.getString("COMENTARIO"));
          
          subprogramas.add(subpro);
          subpro=null;
      }
      rst.close();
      return subprogramas;
  }
  
  
  /**
   * 
   * @param criterea bean with all data to filter the query.
   * @param codeUser code of the user at the moment connected 
   * @param groupUserName Name of the user group
   * @param areaUser Code of the area to which the user belongs
   * @notes This method returns all the subprograms to which a user has permission, as long as they are associate to a seat
   * @author Carlos Ruiz & Daniel Monsalve 
   * @date 04/05/2007
   * @return Collection with the subprograms
   * @throws java.sql.SQLException
   */
  
  public Collection findSubProgramaByCriterea(SubProgramaVO criterea, Long codeUser, String groupUserName, Long areaUser) throws SQLException 
  {
      String query = "select DISTINCT CODIGO,NOMBRE,DESCRIPCION,DIAS_REUTILIZAR,GRUPO_FAMILIAR, "+
      "VALIDAR_CONTRA_ESTUD,VALIDAR_CONTRA_SISBEN,DIRECCION_BEN_OBLIGATORIA,nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "+
                     "DESDE_VIGENCIA,HASTA_VIGENCIA,VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA,"+
                     "COD_USUARIO,NOM_USUARIO,COD_CATEGORIA, NOM_CATEGORIA "+
                     "from VCS_BEN_SUBPROGRAMAS ";
      
      if((Object)codeUser != null)
      {
      query +=" where (ususede = "+codeUser+" OR 'ADMINISTRADOR GENERAL' = '"+groupUserName+"' OR 'SUPER USUARIO' = '"+groupUserName+"' or admSubpro = "+codeUser+
            "          or admProg = "+codeUser ;
            if(groupUserName != null && groupUserName.equals("ADMINISTRADOR SECRETARIA"))
            {
              query += " or AREA_CODIGO = "+areaUser;
            }
            query += " ) ";
      }else return null;
      
      if(criterea.getCode() != null)
      {
      query += " AND CODIGO = "+criterea.getCode()+" ";
      }
      if(!criterea.getNombre().equalsIgnoreCase(""))
      {
      query += " AND NOMBRE LIKE '%"+criterea.getNombre().toUpperCase().trim()+"%' ";
      }
      if(criterea.getCodePrograma() != null && criterea.getCodePrograma().longValue() != 0)
      {
      query += " AND COD_PROGRAMA = "+criterea.getCodePrograma()+" ";
      }
      if (criterea.getCodeArea() != null)
      {
        query += " AND AREA_CODIGO = "+criterea.getCodeArea()+" ";
      }
      query += "ORDER BY NOMBRE";
    
    //System.out.println(query);
    ResultSet rst = null;
    ArrayList subprogramas = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
		SubProgramaVO subpro = null;
		while ( rst.next() ) 
		{
				subpro = new SubProgramaVO();
				subpro.setCode(new Long(rst.getLong( "CODIGO"))); 
        subpro.setNombre(rst.getString( "NOMBRE"));
        subpro.setDescripcion(rst.getString("DESCRIPCION"));
        subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
        subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
        subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
        subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
        subpro.setDirBenObligatoria(rst.getString("DIRECCION_BEN_OBLIGATORIA"));
        subpro.setValorUnitarioBeneficio(rst.getString("VALOR_UNITARIO_BENEFICIO"));
        subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
        subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
        subpro.setVigencia(rst.getString("VIGENCIA"));
        subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
        subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
        subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
        subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
        subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
        subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
				subprogramas.add(subpro);
				subpro=null;
		}
  	rst.close();
    return subprogramas;
  }
  
    public Collection findAllowedSubProgramaWithGestor(SubProgramaVO criterea, Long codeUser, String groupUserName, Long areaUser) throws SQLException 
    {
        String query = "SELECT DISTINCT a.CODIGO,  a.NOMBRE,  a.DESCRIPCION, a.DIAS_REUTILIZAR,  "+
                       "a.GRUPO_FAMILIAR, a.VALIDAR_CONTRA_ESTUD,  a.VALIDAR_CONTRA_SISBEN, "+
                       "a.DIRECCION_BEN_OBLIGATORIA, nvl(a.VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, a.DESDE_VIGENCIA, "+
                       "a.HASTA_VIGENCIA, a.VIGENCIA,a.COD_PROGRAMA, a.NOM_PROGRAMA, a.COD_CATEGORIA,  "+
                       "a.NOM_CATEGORIA, a.COD_AREA "+
                       "FROM VCS_BEN_SUBPROG_ALLOWED a, TCS_BEN_SUBP_ATR_BENEFICIARIO sab ";
                          
        if((Object)codeUser != null)  
        {
          query +=" where ( 'ADMINISTRADOR GENERAL' = '"+groupUserName+"' OR 'SUPER USUARIO' = '"+groupUserName+"' or admSubpro = "+codeUser+
              "          OR admProg = "+codeUser+" OR a.permisos = "+codeUser+" ";
              if(groupUserName != null && groupUserName.equals("ADMINISTRADOR SECRETARIA"))
              {
                query += " OR a.cod_area = "+areaUser;
              }
              query += " ) ";
        }else return null;
        
        if(criterea.getCode() != null)
        {
        query += " AND a.CODIGO = "+criterea.getCode()+" ";
        }
        if(!criterea.getNombre().equalsIgnoreCase(""))
        {
        query += " AND a.NOMBRE LIKE '%"+criterea.getNombre().toUpperCase().trim()+"%' ";
        }
        if(criterea.getCodePrograma() != null)
        {
        query += " AND a.COD_PROGRAMA = "+criterea.getCodePrograma()+" ";
        }
        if (criterea.getCodeArea() != null)
        {
          query += " AND (a.cod_area = "+criterea.getCodeArea()+") ";
        }
        query += " AND a.CODIGO = sab.sbpr_codigo AND UPPER(TRIM(sab.nombre)) = 'GESTOR' ";
        query += " AND a.VIGENCIA = 'A' ORDER BY NOMBRE";

      //System.out.println(query);
      ResultSet rst = null;
      ArrayList subprogramas = new ArrayList();
      rst = cf.getRecordsRset(query,null,conn);
                  SubProgramaVO subpro = null;
                  while ( rst.next() ) 
                  {
                                  subpro = new SubProgramaVO();
                                  subpro.setCode(new Long(rst.getLong( "CODIGO"))); 
          subpro.setNombre(rst.getString( "NOMBRE"));
          subpro.setDescripcion(rst.getString("DESCRIPCION"));
          subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
          subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
          subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
          subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
          subpro.setDirBenObligatoria(rst.getString("DIRECCION_BEN_OBLIGATORIA"));
          subpro.setValorUnitarioBeneficio(rst.getString("VALOR_UNITARIO_BENEFICIO"));
          subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
          subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
          subpro.setVigencia(rst.getString("VIGENCIA"));
          subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
          subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
          subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
          subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
                                  subprogramas.add(subpro);
                                  subpro=null;
                  }
          rst.close();
      return subprogramas;
    }
  
  // Metodo para buscar uno o varios beneficios sin tener en cuenta si estan asociados a una sede
  /**
   * 
   * @param criterea bean with all data to filter the query.
   * @param codeUser code of the user at the moment connected 
   * @param groupUserName Name of the user group
   * @param areaUser Code of the area to which the user belongs
   * @notes This method returns all the subprograms to which a user has permission, as long as they are associate to a seat and enabled.
   * @author Carlos Ruiz & Daniel Monsalve 
   * @date 04/05/2007
   * @return Collection with the subprograms
   * @throws java.sql.SQLException
   */
  public Collection findSubPrograma(SubProgramaVO criterea, Long codeUser, String groupUserName, Long areaUser) throws SQLException 
  {
      String query = "SELECT DISTINCT COD_SUBPRO,  NOM_SUBPRO,  DESC_SUBPRO, FCS_BEN_TIENE_SEDE(COD_SUBPRO) TIENE_SEDE, "+
                     "DREU_SUBPRO,  GRFAM_SUBPRO, VCR_SUBPRO, "+
                     " VCS_SUBPRO, DIROBL_SUBPRO, VALOR_SUBPRO, "+
                     " DESDE_SUBPRO, HASTA_SUBPRO, VIGENCIA_SUBPRO,COD_PROGRAMA, "+
                     "NOM_PROGRAMA, COD_USUARIO, NOM_USUARIO, "+
                     "COD_CATEGORIA,  NOM_CATEGORIA, cod_area, cod_area_prog "+
                     "FROM VCS_BEN_SOLO_SUBPROG_EST_VIG ";
                        
      if((Object)codeUser != null)
      {
        query +=" where ( 'ADMINISTRADOR GENERAL' = '"+groupUserName+"' OR 'SUPER USUARIO' = '"+groupUserName+"' or admSubpro = "+codeUser+
            "          or admProg = "+codeUser ;
            if(groupUserName != null && groupUserName.equals("ADMINISTRADOR SECRETARIA"))
            {
              query += " or cod_area_prog = "+areaUser;
            }
            query += " ) ";
      }else return null;
      
      if(criterea.getCode() != null)
      {
      query += " AND COD_SUBPRO = "+criterea.getCode()+" ";
      }
      if(!criterea.getNombre().equalsIgnoreCase(""))
      {
      query += " AND NOM_SUBPRO LIKE '%"+criterea.getNombre().toUpperCase().trim()+"%' ";
      }
      if(criterea.getCodePrograma() != null)
      {
      query += " AND COD_PROGRAMA = "+criterea.getCodePrograma()+" ";
      }
      if (criterea.getCodeArea() != null)
      {
        query += " AND (cod_area = "+criterea.getCodeArea()+" or cod_area_prog = " +criterea.getCodeArea()+") ";
      }
      query += " ORDER BY NOM_SUBPRO";

    //System.out.println(query);
    ResultSet rst = null;
    ArrayList subprogramas = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
		SubProgramaVO subpro = null;
		while ( rst.next() ) 
		{
				subpro = new SubProgramaVO();
				subpro.setCode(new Long(rst.getLong( "COD_SUBPRO"))); 
        subpro.setNombre(rst.getString( "NOM_SUBPRO"));
        subpro.setDescripcion(rst.getString("DESC_SUBPRO"));
        subpro.setDiasReutilizar(rst.getString("DREU_SUBPRO"));
        subpro.setGrupoFamiliar(rst.getString("GRFAM_SUBPRO"));
        subpro.setValidarEstud(rst.getString("VCR_SUBPRO"));
        subpro.setValidarSisben(rst.getString("VCS_SUBPRO"));
        subpro.setDirBenObligatoria(rst.getString("DIROBL_SUBPRO"));
        subpro.setValorUnitarioBeneficio(rst.getString("VALOR_SUBPRO"));
        subpro.setDesdeVigencia(rst.getString("DESDE_SUBPRO"));
        subpro.setHastaVigencia(rst.getString("HASTA_SUBPRO"));
        subpro.setVigencia(rst.getString("VIGENCIA_SUBPRO"));
        subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
        subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
        subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
        subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
        subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
        subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
		subpro.setTieneSede(rst.getString("TIENE_SEDE"));
				subprogramas.add(subpro);
				subpro=null;
		}
  	rst.close();
    return subprogramas;
  }
  
  
  /**
   * 
   * @param criterea bean with all data to filter the query.
   * @param codeUser code of the user at the moment connected 
   * @param groupUserName Name of the user group
   * @param areaUser Code of the area to which the user belongs
   * @notes This method returns all the subprograms to which a user has permission.
   * @author Carlos Ruiz & Daniel Monsalve 
   * @date 04/05/2007
   * @return Collection with the subprograms
   * @throws java.sql.SQLException
   */
  public Collection findSubProgramaSinVigencia(SubProgramaVO criterea, Long codeUser, String groupUserName, Long areaUser) throws SQLException 
  {
      String query = "SELECT DISTINCT COD_SUBPRO,  NOM_SUBPRO,  DESC_SUBPRO, "+
                     "DREU_SUBPRO,  GRFAM_SUBPRO, VCR_SUBPRO, "+
                     " VCS_SUBPRO, DIROBL_SUBPRO, VALOR_SUBPRO, "+
                     " DESDE_SUBPRO, HASTA_SUBPRO, VIGENCIA_SUBPRO,COD_PROGRAMA, "+
                     "NOM_PROGRAMA, COD_USUARIO, NOM_USUARIO, "+
                     "COD_CATEGORIA,  NOM_CATEGORIA, cod_area, cod_area_prog "+
                     "FROM VCS_BEN_SOLO_SUBPROGRAMAS ";
                        
      if((Object)codeUser != null)
      {
        query +=" where ( 'ADMINISTRADOR GENERAL' = '"+groupUserName+"' OR 'SUPER USUARIO' = '"+groupUserName+"' or admSubpro = "+codeUser+
            "          or admProg = "+codeUser ;
            if(groupUserName != null && groupUserName.equals("ADMINISTRADOR SECRETARIA"))
            {
              query += " or cod_area_prog = "+areaUser;
            }
            query += " ) ";
      }else return null;
      
      if(criterea.getCode() != null)
      {
      query += " AND COD_SUBPRO = "+criterea.getCode()+" ";
      }
      if(!criterea.getNombre().equalsIgnoreCase(""))
      {
      query += " AND NOM_SUBPRO LIKE '%"+criterea.getNombre().toUpperCase().trim()+"%' ";
      }
      if(criterea.getCodePrograma() != null)
      {
      query += " AND COD_PROGRAMA = "+criterea.getCodePrograma()+" ";
      }
      if (criterea.getCodeArea() != null)
      {
        query += " AND (cod_area = "+criterea.getCodeArea()+" or cod_area_prog = " +criterea.getCodeArea()+") ";
      }
      query += " ORDER BY NOM_SUBPRO";

    //System.out.println(query);
    ResultSet rst = null;
    ArrayList subprogramas = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
		SubProgramaVO subpro = null;
		while ( rst.next() ) 
		{
				subpro = new SubProgramaVO();
				subpro.setCode(new Long(rst.getLong( "COD_SUBPRO"))); 
        subpro.setNombre(rst.getString( "NOM_SUBPRO"));
        subpro.setDescripcion(rst.getString("DESC_SUBPRO"));
        subpro.setDiasReutilizar(rst.getString("DREU_SUBPRO"));
        subpro.setGrupoFamiliar(rst.getString("GRFAM_SUBPRO"));
        subpro.setValidarEstud(rst.getString("VCR_SUBPRO"));
        subpro.setValidarSisben(rst.getString("VCS_SUBPRO"));
        subpro.setDirBenObligatoria(rst.getString("DIROBL_SUBPRO"));
        subpro.setValorUnitarioBeneficio(rst.getString("VALOR_SUBPRO"));
        subpro.setDesdeVigencia(rst.getString("DESDE_SUBPRO"));
        subpro.setHastaVigencia(rst.getString("HASTA_SUBPRO"));
        subpro.setVigencia(rst.getString("VIGENCIA_SUBPRO"));
        subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
        subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
        subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
        subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
        subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
        subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
				subprogramas.add(subpro);
				subpro=null;
		}
  	rst.close();
    return subprogramas;
  }
  
  public Collection findAllowedSubPrograma(SubProgramaVO criterea, Long codeUser, String groupUserName, Long areaUser) throws SQLException 
  {
      String query = "SELECT DISTINCT CODIGO,  NOMBRE,  DESCRIPCION, DIAS_REUTILIZAR,  "+
                     "GRUPO_FAMILIAR, VALIDAR_CONTRA_ESTUD,  VALIDAR_CONTRA_SISBEN, "+
      "DIRECCION_BEN_OBLIGATORIA, nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, DESDE_VIGENCIA, "+
                     "HASTA_VIGENCIA, VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA, COD_CATEGORIA,  "+
                     "NOM_CATEGORIA, COD_AREA "+
                     "FROM VCS_BEN_SUBPROG_ALLOWED a";
                        
      if((Object)codeUser != null)  
      {
        query +=" where ( 'ADMINISTRADOR GENERAL' = '"+groupUserName+"' OR 'SUPER USUARIO' = '"+groupUserName+"' or admSubpro = "+codeUser+
            "          OR admProg = "+codeUser+" OR a.permisos = "+codeUser+" ";
            if(groupUserName != null && groupUserName.equals("ADMINISTRADOR SECRETARIA"))
            {
              query += " OR cod_area = "+areaUser;
            }
            query += " ) ";
      }else return null;
      
      if(criterea.getCode() != null)
      {
      query += " AND CODIGO = "+criterea.getCode()+" ";
      }
      if(!criterea.getNombre().equalsIgnoreCase(""))
      {
      query += " AND NOMBRE LIKE '%"+criterea.getNombre().toUpperCase().trim()+"%' ";
      }
      if(criterea.getCodePrograma() != null)
      {
      query += " AND COD_PROGRAMA = "+criterea.getCodePrograma()+" ";
      }
      if (criterea.getCodeArea() != null)
      {
        query += " AND (cod_area = "+criterea.getCodeArea()+") ";
      }
      query += " AND a.VIGENCIA = 'A' ORDER BY NOMBRE";

    //System.out.println(query);
    ResultSet rst = null;
    ArrayList subprogramas = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
		SubProgramaVO subpro = null;
		while ( rst.next() ) 
		{
				subpro = new SubProgramaVO();
				subpro.setCode(new Long(rst.getLong( "CODIGO"))); 
        subpro.setNombre(rst.getString( "NOMBRE"));
        subpro.setDescripcion(rst.getString("DESCRIPCION"));
        subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
        subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
        subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
        subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
        subpro.setDirBenObligatoria(rst.getString("DIRECCION_BEN_OBLIGATORIA"));
        subpro.setValorUnitarioBeneficio(rst.getString("VALOR_UNITARIO_BENEFICIO"));
        subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
        subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
        subpro.setVigencia(rst.getString("VIGENCIA"));
        subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
        subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
        subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
        subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
				subprogramas.add(subpro);
				subpro=null;
		}
  	rst.close();
    return subprogramas;
  }
  
//  public Collection findBeneficioByCriterea(SubProgramaVO criterea, Long codeUser, Long codeGroupUser) throws SQLException 
//  {
//      String query = "select DISTINCT CODIGO,NOMBRE,DESCRIPCION,DIAS_REUTILIZAR,GRUPO_FAMILIAR, "+
//                     "VALIDAR_CONTRA_ESTUD,VALIDAR_CONTRA_SISBEN,DIRECCION_BEN_OBLIGATORIA,VALOR_UNITARIO_BENEFICIO, "+
//                     "DESDE_VIGENCIA,HASTA_VIGENCIA,VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA,"+
//                     "COD_USUARIO,NOM_USUARIO,COD_CATEGORIA, NOM_CATEGORIA "+
//                     "from VCS_BEN_SUBPROGRAMAS ";
//      
//      if((Object)codeUser != null)
//      {
//      query +=" where (ususede = "+codeUser+" OR 33 = "+codeGroupUser+" OR 128 = "+codeGroupUser+") ";
//      }else return null;
//      
//      if(criterea.getCode() != null)
//      {
//      query += " AND CODIGO = "+criterea.getCode()+" ";
//      }
//      if(!criterea.getNombre().equalsIgnoreCase(""))
//      {
//      query += " AND NOMBRE LIKE '%"+criterea.getNombre().toUpperCase().trim()+"%' ";
//      }
//      if(criterea.getCodePrograma() != null)
//      {
//      query += " AND COD_PROGRAMA = "+criterea.getCodePrograma()+" ";
//      }
//      if (criterea.getCodeArea() != null)
//      {
//        query += " AND AREA_CODIGO = "+criterea.getCodeArea()+" ";
//      }
//      query += "ORDER BY NOMBRE";
//
//    //System.out.println(query);
//    ResultSet rst = null;
//    ArrayList subprogramas = new ArrayList();
//    rst = cf.getRecordsRset(query,null,conn);
//		SubProgramaVO subpro = null;
//		while ( rst.next() ) 
//		{
//				subpro = new SubProgramaVO();
//				subpro.setCode(new Long(rst.getLong( "CODIGO"))); 
//        subpro.setNombre(rst.getString( "NOMBRE"));
//        subpro.setDescripcion(rst.getString("DESCRIPCION"));
//        subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
//        subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
//        subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
//        subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
//        subpro.setDirBenObligatoria(rst.getString("DIRECCION_BEN_OBLIGATORIA"));
//        subpro.setValorUnitarioBeneficio(rst.getString("VALOR_UNITARIO_BENEFICIO"));
//        subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
//        subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
//        subpro.setVigencia(rst.getString("VIGENCIA"));
//        subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
//        subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
//        subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
//        subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
//        subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
//        subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
//				subprogramas.add(subpro);
//				subpro=null;
//		}
//  	rst.close();
//    return subprogramas;
//  }
  
//  public Collection findSubProgramaByUser(Long codeUser, String nameGus, SubProgramaVO criterea) throws SQLException 
//  {
//    String query = "select subpro.codigo codeSubprograma, upper(subpro.nombre) nomSubprograma "+
//                   "from tcs_ben_subprograma subpro, "+
//                   " tcs_ben_area area, TCS_BEN_PROGRAMA pro, "+
//                   "paoyer.tcs_usuario usu, "+
//                   "paoyer.tcs_grupo_usuario gus "+
//                   "where subpro.USU_CODIGO = usu.CODIGO "+
//                   " and area.CODIGO = subpro.AREA_CODIGO "+
//                   " AND pro.codigo = subpro.PRG_CODIGO "+
//                   "and Fcs_Ben_Val_Vigencia(subpro.VIGENCIA, subpro.DESDE_VIGENCIA, subpro.HASTA_VIGENCIA, sysdate) = 'A' "+
//                   " and gus.DESCRIPCION = '"+nameGus+"' ";
//    ArrayList subprogramas = new ArrayList();
//    if(!nameGus.equalsIgnoreCase("") && codeUser != null)
//    {       
//        query += " and ('"+nameGus+"' = 'ADMINISTRADOR GENERAL' or '"+nameGus+"' = 'SUPER USUARIO' or subpro.usu_codigo = "+codeUser+" OR pro.usu_codigo ="+codeUser+") ";
//        
//        if(criterea.getCodePrograma() != null)
//        {
//          query += " and subpro.PRG_CODIGO = "+criterea.getCodePrograma();
//        }
//        
//        if(!criterea.getNombre().equalsIgnoreCase(""))
//        {
//          query += "AND subpro.NOMBRE LIKE UPPER('%"+criterea.getNombre().trim()+"%') ";
//        }
//        if(criterea.getCodeArea() != null)
//        {
//          query += "AND area.AREA_CODIGO = "+criterea.getCodeArea();
//        }
//        
//                      
//        query += "order by subpro.nombre";
//        ResultSet rst = null;
//        //System.out.println(query);
//        rst = cf.getRecordsRset(query,null,conn);
//        SubProgramaVO subpro = null;
//        while ( rst.next() ) 
//        {
//            subpro = new SubProgramaVO();
//            subpro.setCode(new Long(rst.getLong( "codeSubprograma"))); 
//            subpro.setNombre(rst.getString( "nomSubprograma"));
//            subprogramas.add(subpro);
//            subpro=null;
//        }
//        rst.close();
//    }
//    return subprogramas;
//  }
  
  public Connection getConn()
  {
    return conn;
  }

  /**
   * Autor Felipe R.
   * Modificacion
   * @param strArr
   * @return 
   * @throws java.sql.SQLException
   */ 
 public int InsetBeneficioOtorgado(String strArr[], int i, String DateBenefit)throws SQLException{
     
     String fecha = "select to_char((select to_date('"+DateBenefit+"','dd/mm/RRRR') from dual)+"+i+",'dd/mm/RRRR') fecha from dual ";
     ResultSet rs = cf.getRecordsRset(fecha,null,conn);
     if(rs.next())
     {
       fecha = rs.getString("fecha");
     }else
     {
       fecha = "sysdate";
     }
     String strSql = "INSERT INTO TCS_BEN_BENEFICIO_OTORGADO (CODIGO, SBPR_CODIGO, " +
                     "BEN_CODIGO, SEDE_CODIGO, TERCERO, FECHA_BENEFICIO, CAMPO_F1, VALOR_BENEFICIO, TIPO_BENEFICIO, "+ 
                     "USUARIO_CREA, TERMINAL_CREA, USUARIO_MODIFICA, TERMINAL_MODIFICA) "+
                     " VALUES(SCS_BEN_BOT.NEXTVAL,?,?,?,?,to_date('"+fecha+"','dd/mm/RRRR'),to_date(sysdate,'dd/mm/RRRR'),?,?,?,?,?,?)";
     //System.out.println(strSql);
     int bInsertoCorrectamente = cf.execSql(strSql, strArr,conn);
     return bInsertoCorrectamente;
       
} 

    public int updateBeneficioOtorgado(String strArr[], int i, String DateBenefit, String codeBot) throws SQLException {
        String fecha = "select to_char((select to_date('"+DateBenefit+"','dd/mm/RRRR') from dual)+"+i+",'dd/mm/RRRR') fecha from dual ";
        ResultSet rs = cf.getRecordsRset(fecha,null,conn);
        if(rs.next()){
          fecha = rs.getString("fecha");
        } else {
          fecha = "sysdate";
        }
        
        String strSql = "{call PCS_BEN_UPDATE_BOT("+strArr[0]+", '"+strArr[1]+"', '"+fecha+"', " +
                        ""+strArr[2]+",'"+strArr[3]+"', '"+strArr[4]+"', "+codeBot+", ?)}";
        CallableStatement cs = null;
        cs = conn.prepareCall(strSql);

        cs.registerOutParameter(1, Types.INTEGER);
        cs.execute();
        
        return cs.getInt(1);
    }
    
    /**
     * Autor Andres Cespedes
     * @param strArr
     * @param i
     * @param DateBenefit
     * @param codeBot
     * @param tipoBot tipo de beneficio, atributo muy usado por los programas de la secretaria de la mujer.
     * @return
     * @throws SQLException
     */
	public int updateBeneficioOtorgado(String strArr[], int i, String DateBenefit, String codeBot, String tipoBot) throws SQLException {
			String fecha = "select to_char((select to_date('"+DateBenefit+"','dd/mm/RRRR') from dual)+"+i+",'dd/mm/RRRR') fecha from dual ";
			ResultSet rs = cf.getRecordsRset(fecha,null,conn);
			if(rs.next()){
			  fecha = rs.getString("fecha");
			} else {
			  fecha = "sysdate";
			}
        
			String strSql = "{call PCS_BEN_UPDATE_BOT_NEWTP("+strArr[0]+", '"+strArr[1]+"', '"+fecha+"', " +
							""+strArr[2]+",'"+tipoBot+"','"+strArr[3]+"', '"+strArr[4]+"', "+codeBot+", ?)}";
			CallableStatement cs = null;
			cs = conn.prepareCall(strSql);

			cs.registerOutParameter(1, Types.INTEGER);
			cs.execute();
        
			return cs.getInt(1);
		}

  /**
   * Autor Felipe R.
   * @param codeSubpro
   * @return 
   * @throws java.sql.SQLException
   */
public SubProgramaVO GetPropiedadesSubpro(Long codeSubpro) throws SQLException 
  {
    String query = "SELECT DIAS_REUTILIZAR,CAMPO_A3 FROM TCS_BEN_SUBPROGRAMA WHERE CODIGO ="+codeSubpro+"";
    
    ResultSet rst = null;
    rst = cf.getRecordsRset(query,null,conn);
		SubProgramaVO subpro = null;
		if ( rst.next() ) 
		{
				subpro = new SubProgramaVO();
				
        subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
        subpro.setDiasRenovacion(rst.getString("CAMPO_A3"));
		}
  	rst.close();
    return subpro;
  }

    public String CodMaxBenOtor()throws SQLException{
       
        String codigo ="";
        String strSql = "SELECT SCS_BEN_BOT.currval CODEMAX FROM dual";
        ResultSet rst = null;
        rst = cf.getRecordsRset(strSql,null,conn);
        
        while ( rst.next() ) 
        {
            codigo = rst.getString("CODEMAX"); 
            
        }
        return codigo;
       
    }

      public String getCantidadDisponible()throws SQLException{
               
                String codigo ="";
                String strSql = "SELECT MAX(CODIGO) CODEMAX FROM TCS_BEN_BENEFICIO_OTORGADO";
                ResultSet rst = null;
                rst = cf.getRecordsRset(strSql,null,conn);
                
                while ( rst.next() ) 
                {
                    codigo = rst.getString("CODEMAX"); 
                    
                }
                return codigo;
               
      }
      
    public String getMaxCode()throws SQLException{
        String codigo ="";
        String strSql = "Select max(codigo) max_codigo from tcs_ben_subprograma";
        ResultSet rst = null;
        rst = cf.getRecordsRset(strSql,null,conn);
        if ( rst.next() ) 
        {
            codigo = rst.getString("max_codigo");
        }
        return codigo;
             
    }
      
    public int InsertBeneficio(SubprogramaForm subform, String user, String strTerminal, String strDate )throws SQLException {
        
        String query = " Insert into tcs_ben_subprograma (CODIGO, PRG_CODIGO, USU_CODIGO, "+ 
                 " NOMBRE, DESCRIPCION, DIAS_REUTILIZAR, GRUPO_FAMILIAR, "+
                 " VALIDAR_CONTRA_ESTUD, VALIDAR_CONTRA_SISBEN, VALOR_UNITARIO_BENEFICIO, "+
                 " DESDE_VIGENCIA, HASTA_VIGENCIA, VIGENCIA, AREA_CODIGO,CAMPO_A3, CAMPO_A1, "+
                 " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "+
                 " values (SCS_BEN_SBPR.NEXTVAL,?,?,upper(?),upper(?),?,?,?,?,?,to_date(?,'dd/mm/rrrr'),to_date(?,'dd/mm/rrrr'),'A',?,?,?,?,to_date(?,'dd/mm/rrrr'),?,?,to_date(?,'dd/mm/rrrr'),?) ";
       
         
        String Arr[] = {subform.getCodePrograma(), subform.getAdmincodigo1(),subform.getSubprograma().trim(),
                        subform.getDescripcion(),subform.getDias(),subform.getGrupfam(),subform.getValestudiantes(),
                        subform.getSisben(),subform.getValor(),subform.getDesde(),subform.getHasta(),subform.getSubsecretaria(),
                        subform.getDiasrenovar(),subform.getSolounavez() ,user,strDate,strTerminal,user,strDate,strTerminal};
        
        int bInsertoCorrectamente = cf.execSql(query, Arr,conn);
        return bInsertoCorrectamente;
       
    }
 
 /**
   * Autor DORIS
   * @param codeSubprograma
   * @return 
   */
  
  
   public boolean getEstadoSubprograma(SubProgramaVO criterea){
  
    String query = "select  codigo from tcs_ben_subprograma where  vigencia = 'I' and "+
                   " codigo = "+criterea.getCode();  ;
                   
    ResultSet rst = null;
    
    try{
    rst = cf.getRecordsRset(query,null,conn);
    
      if(rst.next() ){
          return true; 
      }else{
          return false;
      }
    
    }catch(Exception e){
		System.err.println("/******** TDSUB - cwsub");
		e.printStackTrace();
		System.err.println("TDSSPE - cwsub ********/");
      return false;
    }
    
  }

/**
   * Autor DORIS
   * @param codePrograma
   * @return 
   */
  public Collection getActivarSub(ProgramaVO criterea){
  
  String strSql = " SELECT sub.nombre nombre, sub.codigo codigo, prog.nombre nombrepro "+
                  " FROM TCS_BEN_SUBPROGRAMA sub, TCS_BEN_PROGRAMA prog "+
                  " WHERE (sub.vigencia <> 'A' OR SYSDATE > sub.HASTA_VIGENCIA) and sub.PRG_CODIGO = prog.CODIGO AND "+
                  " prog.codigo = "+criterea.getCodePrograma();

  ArrayList subprogramas = new ArrayList();   
  try{
  ResultSet rst = cf.getRecordsRset(strSql,null,conn);
	SubProgramaVO subpro = null;
		while ( rst.next() ) 
		{
				subpro = new SubProgramaVO();
				subpro.setCode(new Long(rst.getString("codigo")));
        subpro.setNombre(rst.getString("nombre"));
        subpro.setNombrePrograma(rst.getString("nombrepro"));
				subprogramas.add(subpro);
				subpro=null;
		}
  	rst.close();
  }catch(SQLException e){
	System.err.println("/******** TDSUB - cwsub");
	e.printStackTrace();
	System.err.println("TDSSPE - cwsub ********/");
  }
    return subprogramas;                    
  
  }
  
  
/**
   * 
   * @param criterea bean with all data to filter the query.
   * @param codeUser code of the user at the moment connected 
   * @param groupUserName Name of the user group
   * @param areaUser Code of the area to which the user belongs
   * @notes This method returns all the subprograms to which a user has permission, as long as they are disabled
   * @author Carlos Ruiz & Daniel Monsalve 
   * @date 04/05/2007
   * @return Collection with the subprograms
   * @throws java.sql.SQLException
   */
   public Collection getActivarSubprogramas2(Long codeUser, String groupUserName, Long areaUser){
  
  String strSql = "SELECT * FROM VCS_BEN_SOLO_SUBPROGRAMAS ";
  if((Object)codeUser != null)
      {
        strSql +=" where ( 'ADMINISTRADOR GENERAL' = '"+groupUserName+"' OR 'SUPER USUARIO' = '"+groupUserName+"' or admSubpro = "+codeUser+
            "          or admProg = "+codeUser ;
            if(groupUserName != null && groupUserName.equals("ADMINISTRADOR SECRETARIA"))
            {
              strSql += " or AREA_CODIGO = "+areaUser;
            }
            strSql += " ) ";
      }
  strSql += " and (VIGENCIA_SUBPRO = 'I' OR sysdate > HASTA_SUBPRO) "; 
  ArrayList subprogramas = new ArrayList();  

  try{
  ResultSet rst = cf.getRecordsRset(strSql,null,conn);
	SubProgramaVO subpro = null;
		while ( rst.next() ) 
		{
				subpro = new SubProgramaVO();
				subpro.setCode(new Long(rst.getString("COD_SUBPRO")));
        subpro.setNombre(rst.getString("NOM_SUBPRO"));
        subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
				subprogramas.add(subpro);
				subpro=null;
		}
  	rst.close();
  }catch(SQLException e){
	System.err.println("/******** TDSUB - cwsub");
	e.printStackTrace();
	System.err.println("TDSSPE - cwsub ********/");
  }
    return subprogramas;                    
  
  }
  
  public Collection getSubprogVigentes(SubProgramaVO criterea, Long codeUser, String groupUserName, Long areaUser) throws SQLException
  {
    /*String query = "SELECT DISTINCT COD_SUBPRO,  NOM_SUBPRO,  DESC_SUBPRO, "+
                   "DREU_SUBPRO,  GRFAM_SUBPRO, VCR_SUBPRO, "+
                   " VCS_SUBPRO, DIROBL_SUBPRO, VALOR_SUBPRO, "+
                   " DESDE_SUBPRO, HASTA_SUBPRO, VIGENCIA_SUBPRO,COD_PROGRAMA, "+
                   "NOM_PROGRAMA, COD_USUARIO, NOM_USUARIO, "+
                   "COD_CATEGORIA,  NOM_CATEGORIA, cod_area, cod_area_prog "+
                   "FROM VCS_BEN_SOLO_SUBPROG_EST_VIG ";
    */
    String query = "SELECT DISTINCT CODIGO, NOMBRE, DESCRIPCION, "+
                   "DIAS_REUTILIZAR, GRUPO_FAMILIAR, VALIDAR_CONTRA_ESTUD, "+
      "VALIDAR_CONTRA_SISBEN, DIRECCION_BEN_OBLIGATORIA, nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "+
                   "DESDE_VIGENCIA, HASTA_VIGENCIA, VIGENCIA,COD_PROGRAMA, "+
                   "NOM_PROGRAMA, COD_CATEGORIA,  NOM_CATEGORIA, AREA_CODIGO "+
                   "FROM VCS_BEN_SUBPROG_ALLOWED ";
    
    
    if((Object)codeUser != null)
      {
        query +=" where ( 'ADMINISTRADOR GENERAL' = '"+groupUserName+"' OR 'SUPER USUARIO' = '"+groupUserName+"' or admSubpro = "+codeUser+
            "          or admProg = "+codeUser ;
            if(groupUserName != null && groupUserName.equals("ADMINISTRADOR SECRETARIA"))
            { 
              query += " or AREA_CODIGO = "+areaUser;
            }
            query += " ) ";
      }else return null;
      
      if(criterea.getCode() != null)
      {
        query += " AND CODIGO = "+criterea.getCode()+" ";
      }
      
      if(criterea.getCodePrograma() != null && criterea.getCodePrograma().longValue() != 0)
      {
      query += " AND COD_PROGRAMA = "+criterea.getCodePrograma()+" ";
      }
      if (areaUser != null && areaUser.longValue() != 0)
      {
        query += " AND (AREA_CODIGO = " +areaUser.longValue()+") ";
      }
      
      query += " AND VIGENCIA <> 'I' "+ 
               " ORDER BY NOMBRE";
      
      //System.out.println(query);
      ResultSet rst = null;
      ArrayList subprogramas = new ArrayList();
      rst = cf.getRecordsRset(query,null,conn);
      SubProgramaVO subpro = null;
      while ( rst.next() ) 
      {
          subpro = new SubProgramaVO();
          subpro.setCode(new Long(rst.getLong("CODIGO"))); 
          subpro.setNombre(rst.getString("NOMBRE"));
          subpro.setDescripcion(rst.getString("DESCRIPCION"));
          subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
          subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
          subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
          subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
          subpro.setDirBenObligatoria(rst.getString("DIRECCION_BEN_OBLIGATORIA"));
          subpro.setValorUnitarioBeneficio(rst.getString("VALOR_UNITARIO_BENEFICIO"));
          subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
          subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
          subpro.setVigencia(rst.getString("VIGENCIA"));
          subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
          subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
          subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
          subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
          subprogramas.add(subpro);
          subpro=null;
      }
      rst.close();
      return subprogramas;
  }
  
  public String getNameByCode(String strCodeSub) throws SQLException
  {
    String query = "SELECT nombre FROM tcs_ben_subprograma "+
                   "WHERE codigo = "+strCodeSub;
    
    String strName = null;
    ResultSet rst = null;
    rst = cf.getRecordsRset(query,null,conn);
    if(rst.next())
    {
      strName = rst.getString("nombre");
    }
    rst.close();
    return strName;
  }
  
  //M�todo para obtener el c�digo del subprograma a partir del c�digo del beneficio otorgado
  
    public String getCodeSubBOT(String codeBOT) throws SQLException {
      String query = " SELECT SBPR_CODIGO " +
                     " FROM TCS_BEN_BENEFICIO_OTORGADO " +
                     " WHERE codigo ="+codeBOT;
      
      ResultSet rst = null;
      rst = cf.getRecordsRset(query, null, conn);
      
      rst.next();
      
      return rst.getString("SBPR_CODIGO");
    }
    
	public boolean isRelatedWithSede(String codeSub) throws SQLException {
		String query = " SELECT COUNT(DISTINCT CODIGO) Cantidad " +
					   " FROM VCS_BEN_SUBPROGRAMAS" +
					   " WHERE CODIGO = "+codeSub;
                       
		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
        
		rst.next();
        
		if(rst.getInt("Cantidad") == 0){
			return false;
		} else {
			return true;
		}
	}
  
  
	public String getPrograma(String codeSubprograma) throws SQLException {
		String strSql = "SELECT PRG_CODIGO " +
						" FROM TCS_BEN_SUBPROGRAMA " +
						" WHERE CODIGO ="+ codeSubprograma;
                        
		ResultSet rst = null;
		rst = cf.getRecordsRset(strSql, null, conn);
        
		rst.next();
        
		return rst.getString("PRG_CODIGO");
	}
}